package service

import (
	"errors"
	"go-malphite/app/common/constant"
	"go-malphite/app/common/dto"
	"go-malphite/app/model"
	"go-malphite/app/utils"
	"gorm.io/gorm"
)

// FindTodoById 根据id查找待办
func FindTodoById(id int64) (model.Todo, error) {
	todo := model.Todo{}
	err := utils.DB.Where("id = ?", id).First(&todo).Error
	if err != nil {
		return todo, err
	}
	return todo, nil
}

// InsertTodo 插入待办
func InsertTodo(todo model.Todo) bool {
	tx := utils.DB.Begin()
	defer dto.CommitOrRollback(tx)
	err := tx.Create(&todo).Error
	if err != nil {
		return false
	}
	return true
}

// RemoveTodo 移除待办
func RemoveTodo(id int64) bool {
	tx := utils.DB.Begin()
	defer dto.CommitOrRollback(tx)
	err := tx.Where("id = ?", id).Delete(&model.Todo{}).Error
	if err != nil {
		return false
	}
	return true
}

// GetDetailTodo 获取待办详情
func GetDetailTodo(id, userId int64) (*model.TodoOneRes, error) {
	todo := model.Todo{}
	err := utils.DB.Where("id = ? and user_id = ?", id, userId).First(&todo).Error
	if errors.Is(err, gorm.ErrRecordNotFound) {
		return nil, errors.New("待办不存在！")
	}
	if err != nil {
		return nil, errors.New("获取待办详情失败！")
	}
	data := &model.TodoOneRes{
		ID:        todo.ID,
		Status:    todo.Status,
		Content:   todo.Content,
		CreatedAt: todo.CreatedAt.Format(constant.DateTimeFormat),
		UpdatedAt: todo.UpdatedAt.Format(constant.DateTimeFormat),
	}
	return data, nil
}

// UpdateTodo 更新待办
func UpdateTodo(todo model.Todo) bool {
	tx := utils.DB.Begin()
	defer dto.CommitOrRollback(tx)
	err := tx.Model(&model.Todo{}).Where("id = ?", todo.ID).Updates(todo).Error
	if err != nil {
		return false
	}
	return true
}

// GetListTodo 获取待办列表
func GetListTodo(userId int64) ([]model.TodoOneRes, error) {
	var dataList = make([]model.TodoOneRes, 0)
	var todoList []model.Todo
	err := utils.DB.Order("created_at desc").Where("user_id = ?", userId).Find(&todoList).Error
	if err != nil {
		return nil, err
	}
	for _, todo := range todoList {
		dataList = append(dataList, model.TodoOneRes{
			ID:        todo.ID,
			Status:    todo.Status,
			Content:   todo.Content,
			CreatedAt: todo.CreatedAt.Format(constant.DateTimeFormat),
			UpdatedAt: todo.UpdatedAt.Format(constant.DateTimeFormat),
		})
	}
	return dataList, nil
}

// GetPageTodo 获取待办列表分页
func GetPageTodo(userId int64, page dto.PageReq) (*model.TodoPageRes, error) {
	var total int64
	if err := utils.DB.Model(model.Todo{}).Where("user_id = ?", userId).Count(&total).Error; err != nil {
		return nil, errors.New("查询数据异常")
	}
	var records = make([]model.TodoOneRes, 0)
	var todoList []model.Todo
	err := utils.DB.Scopes(dto.Paginate(page.Current, page.Size)).Order("created_at desc").Where("user_id = ?", userId).Find(&todoList).Error
	if err != nil {
		return nil, err
	}
	for _, todo := range todoList {
		records = append(records, model.TodoOneRes{
			ID:        todo.ID,
			Status:    todo.Status,
			Content:   todo.Content,
			CreatedAt: todo.CreatedAt.Format(constant.DateTimeFormat),
			UpdatedAt: todo.UpdatedAt.Format(constant.DateTimeFormat),
		})
	}
	todoPageRes := &model.TodoPageRes{
		PageRes: dto.PageRes{
			Current: page.Current,
			Size:    page.Size,
			Total:   total,
		},
		Records: records,
	}
	return todoPageRes, nil
}
